}
static struct disk_driver *disk_init(struct td_state *s,
- struct tap_disk *drv, char *name)
+ struct tap_disk *drv,
+ char *name, td_flag_t flags)
{
struct disk_driver *dd;
dd->drv = drv;
dd->td_state = s;
dd->name = name;
+ dd->flags = flags;
return dd;
}
-static int open_disk(struct td_state *s, struct tap_disk *drv, char *path)
+static int open_disk(struct td_state *s,
+ struct tap_disk *drv, char *path, td_flag_t flags)
{
int err;
char *dup;
+ td_flag_t pflags;
struct disk_id id;
struct disk_driver *d;
return -ENOMEM;
memset(&id, 0, sizeof(struct disk_id));
- s->disks = d = disk_init(s, drv, dup);
+ s->disks = d = disk_init(s, drv, dup, flags);
if (!d)
return -ENOMEM;
- err = drv->td_open(d, path, 0);
+ err = drv->td_open(d, path, flags);
if (err) {
free_driver(d);
s->disks = NULL;
return -ENOMEM;
}
+ pflags = flags | TD_RDONLY;
/* load backing files as necessary */
while ((err = d->drv->td_get_parent_id(d, &id)) == 0) {
if (!dup)
goto fail;
- new = disk_init(s, get_driver(id.drivertype), dup);
+ new = disk_init(s, get_driver(id.drivertype), dup, pflags);
if (!new)
goto fail;
- err = new->drv->td_open(new, new->name, TD_RDONLY);
+ err = new->drv->td_open(new, new->name, pflags);
if (err)
goto fail;
free(id.name);
}
+ s->info |= ((flags & TD_RDONLY) ? VDISK_READONLY : 0);
+
if (err >= 0)
return 0;
goto params_done;
/*Open file*/
- ret = open_disk(s, drv, path);
+ ret = open_disk(s, drv, path,
+ ((msg->readonly) ? TD_RDONLY : 0));
if (ret)
goto params_done;
if (!run) return; /*We have received signal to close*/
- if (drv->td_do_callbacks(dd, sid) > 0) kick_responses(dd->td_state);
+ if (sid > MAX_IOFD || drv->td_do_callbacks(dd, sid) > 0)
+ kick_responses(dd->td_state);
return;
}
sector_nr = req->sector_number;
}
+ if ((dd->flags & TD_RDONLY) &&
+ (req->operation == BLKIF_OP_WRITE)) {
+ blkif->pending_list[idx].status = BLKIF_RSP_ERROR;
+ goto send_response;
+ }
+
for (i = start_seg; i < req->nr_segments; i++) {
nsects = req->seg[i].last_sect -
req->seg[i].first_sect + 1;
}
sector_nr += nsects;
}
+ send_response:
blkif->pending_list[idx].submitting = 0;
/* force write_rsp_to_ring for synchronous case */
if (blkif->pending_list[idx].secs_pending == 0)
- dd->early += send_responses(dd, 0, 0, 0, idx, (void *)0);
+ dd->early += send_responses(dd, 0, 0, 0, idx,
+ (void *)(long)0);
}
out:
td_for_each_disk(s, dd) {
dd->early += dd->drv->td_submit(dd);
if (dd->early > 0) {
- io_done(dd, 10);
+ io_done(dd, MAX_IOFD + 1);
dd->early = 0;
}
}
dd->early +=
dd->drv->td_submit(dd);
if (dd->early > 0) {
- io_done(dd, 10);
+ io_done(dd,
+ MAX_IOFD + 1);
dd->early = 0;
}
}